home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple WWDC 1996
/
WWDC96_1996 (CD).toast
/
Technology Materials
/
MacOS 8 Resources
/
Developer Tools
/
Mac OS 8 Interfaces & Libraries
/
Interfaces
/
AIncludes
/
SCSI.a
< prev
next >
Wrap
Text File
|
1996-05-01
|
61KB
|
1,365 lines
;
; File: SCSI.a
;
; Contains: SCSI Family Interfaces.
;
; Version: Technology: System 8.0
; Release: Universal Interfaces 3.0d3 on Copland DR1
;
; Copyright: © 1984-1996 by Apple Computer, Inc. All rights reserved.
;
; Bugs?: If you find a problem with this file, send the file and version
; information (from above) and the problem description to:
;
; Internet: apple.bugs@applelink.apple.com
; AppleLink: APPLE.BUGS
;
;
IF &TYPE('__SCSI__') = 'UNDEFINED' THEN
__SCSI__ SET 1
IF &TYPE('__TYPES__') = 'UNDEFINED' THEN
include 'Types.a'
ENDIF
IF &TYPE('__MIXEDMODE__') = 'UNDEFINED' THEN
include 'MixedMode.a'
ENDIF
IF FOR_SYSTEM8_PREEMPTIVE THEN
IF &TYPE('__KERNEL__') = 'UNDEFINED' THEN
include 'Kernel.a'
ENDIF
IF &TYPE('__NAMEREGISTRY__') = 'UNDEFINED' THEN
include 'NameRegistry.a'
ENDIF
IF &TYPE('__IOITERATOR__') = 'UNDEFINED' THEN
include 'IOIterator.a'
ENDIF
ENDIF
IF FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE THEN
; SCSI Manager errors
scCommErr EQU 2 ; communications error, operation timeout
scArbNBErr EQU 3 ; arbitration timeout waiting for not BSY
scBadParmsErr EQU 4 ; bad parameter or TIB opcode
scPhaseErr EQU 5 ; SCSI bus not in correct phase for attempted operation
scCompareErr EQU 6 ; data compare error
scMgrBusyErr EQU 7 ; SCSI Manager busy
scSequenceErr EQU 8 ; attempted operation is out of sequence
scBusTOErr EQU 9 ; CPU bus timeout
scComplPhaseErr EQU 10 ; SCSI bus wasn't in Status phase
ENDIF
IF FOR_SYSTEM7_ONLY THEN
; TIB opcodes
scInc EQU 1
scNoInc EQU 2
scAdd EQU 3
scMove EQU 4
scLoop EQU 5
scNop EQU 6
scStop EQU 7
scComp EQU 8
; Signatures
sbSIGWord EQU $4552 ; signature word for Block 0 ('ER')
sbMac EQU 1 ; system type for Mac
pMapSIG EQU $504D ; partition map signature ('PM')
pdSigWord EQU $5453
oldPMSigWord EQU $5453
newPMSigWord EQU $504D
; Driver Descriptor Map
Block0 RECORD 0
sbSig ds.w 1 ; offset: $0 (0) ; unique value for SCSI block 0
sbBlkSize ds.w 1 ; offset: $2 (2) ; block size of device
sbBlkCount ds.l 1 ; offset: $4 (4) ; number of blocks on device
sbDevType ds.w 1 ; offset: $8 (8) ; device type
sbDevId ds.w 1 ; offset: $A (10) ; device id
sbData ds.l 1 ; offset: $C (12) ; not used
sbDrvrCount ds.w 1 ; offset: $10 (16) ; driver descriptor count
ddBlock ds.l 1 ; offset: $12 (18) ; 1st driver's starting block
ddSize ds.w 1 ; offset: $16 (22) ; size of 1st driver (512-byte blks)
ddType ds.w 1 ; offset: $18 (24) ; system type (1 for Mac+)
ddPad ds.w 243 ; offset: $1A (26) ; ARRAY[0..242] OF INTEGER; not used
sizeof EQU * ; size: $200 (512)
ENDR
; Driver descriptor
DDMap RECORD 0
ddBlock ds.l 1 ; offset: $0 (0) ; 1st driver's starting block
ddSize ds.w 1 ; offset: $4 (4) ; size of 1st driver (512-byte blks)
ddType ds.w 1 ; offset: $6 (6) ; system type (1 for Mac+)
sizeof EQU * ; size: $8 (8)
ENDR
; Partition Map Entry
Partition RECORD 0
pmSig ds.w 1 ; offset: $0 (0) ; unique value for map entry blk
pmSigPad ds.w 1 ; offset: $2 (2) ; currently unused
pmMapBlkCnt ds.l 1 ; offset: $4 (4) ; # of blks in partition map
pmPyPartStart ds.l 1 ; offset: $8 (8) ; physical start blk of partition
pmPartBlkCnt ds.l 1 ; offset: $C (12) ; # of blks in this partition
pmPartName ds.b 32 ; offset: $10 (16) ; ASCII partition name
pmParType ds.b 32 ; offset: $30 (48) ; ASCII partition type
pmLgDataStart ds.l 1 ; offset: $50 (80) ; log. # of partition's 1st data blk
pmDataCnt ds.l 1 ; offset: $54 (84) ; # of blks in partition's data area
pmPartStatus ds.l 1 ; offset: $58 (88) ; bit field for partition status
pmLgBootStart ds.l 1 ; offset: $5C (92) ; log. blk of partition's boot code
pmBootSize ds.l 1 ; offset: $60 (96) ; number of bytes in boot code
pmBootAddr ds.l 1 ; offset: $64 (100) ; memory load address of boot code
pmBootAddr2 ds.l 1 ; offset: $68 (104) ; currently unused
pmBootEntry ds.l 1 ; offset: $6C (108) ; entry point of boot code
pmBootEntry2 ds.l 1 ; offset: $70 (112) ; currently unused
pmBootCksum ds.l 1 ; offset: $74 (116) ; checksum of boot code
pmProcessor ds.b 16 ; offset: $78 (120) ; ASCII for the processor type
pmPad ds.w 188 ; offset: $88 (136) ; ARRAY[0..187] OF INTEGER; not used
sizeof EQU * ; size: $200 (512)
ENDR
; TIB instruction
SCSIInstr RECORD 0
scOpcode ds.w 1 ; offset: $0 (0)
scParam1 ds.l 1 ; offset: $2 (2)
scParam2 ds.l 1 ; offset: $6 (6)
sizeof EQU * ; size: $A (10)
ENDR
; SCSI Phases (used by SIMs to support the Original SCSI Manager
kDataOutPhase EQU 0 ; Encoded MSG, C/D, I/O bits
kDataInPhase EQU 1
kCommandPhase EQU 2
kStatusPhase EQU 3
kPhaseIllegal0 EQU 4
kPhaseIllegal1 EQU 5
kMessageOutPhase EQU 6
kMessageInPhase EQU 7
kBusFreePhase EQU 8 ; Additional Phases
kArbitratePhase EQU 9
kSelectPhase EQU 10
kMessageInPhaseNACK EQU 11 ; Message In Phase with ACK hanging on the bus
;
; pascal OSErr SCSIReset(void )
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSIReset
clr.w -(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIReset
ENDIF
;
; pascal OSErr SCSIGet(void )
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSIGet
move.w #$0001,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIGet
ENDIF
;
; pascal OSErr SCSISelect(short targetID)
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSISelect
move.w #$0002,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSISelect
ENDIF
;
; pascal OSErr SCSICmd(Ptr buffer, short count)
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSICmd
move.w #$0003,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSICmd
ENDIF
;
; pascal OSErr SCSIRead(Ptr tibPtr)
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSIRead
move.w #$0005,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIRead
ENDIF
;
; pascal OSErr SCSIRBlind(Ptr tibPtr)
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSIRBlind
move.w #$0008,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIRBlind
ENDIF
;
; pascal OSErr SCSIWrite(Ptr tibPtr)
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSIWrite
move.w #$0006,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIWrite
ENDIF
;
; pascal OSErr SCSIWBlind(Ptr tibPtr)
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSIWBlind
move.w #$0009,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIWBlind
ENDIF
;
; pascal OSErr SCSIComplete(short *stat, short *message, unsigned long wait)
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSIComplete
move.w #$0004,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIComplete
ENDIF
;
; pascal short SCSIStat(void )
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSIStat
move.w #$000A,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIStat
ENDIF
;
; pascal OSErr SCSISelAtn(short targetID)
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSISelAtn
move.w #$000B,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSISelAtn
ENDIF
;
; pascal OSErr SCSIMsgIn(short *message)
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSIMsgIn
move.w #$000C,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIMsgIn
ENDIF
;
; pascal OSErr SCSIMsgOut(short message)
;
IF ¨ GENERATINGCFM THEN
Macro
_SCSIMsgOut
move.w #$000D,-(sp)
dc.w $A815
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIMsgOut
ENDIF
scsiVERSION EQU 43
ENDIF
IF FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE THEN
; SCSI Callback Procedure Prototypes
; SCSIInterruptPollProcPtr is obsolete (use SCSIInterruptProcPtr) but still here for compatibility
ENDIF
IF FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE THEN
ENDIF
IF FOR_SYSTEM7_ONLY THEN
ENDIF
IF FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE THEN
; SCSI Manager function codes
SCSINop EQU $00 ; Execute nothing
SCSIExecIO EQU $01 ; Execute the specified IO
SCSIBusInquiry EQU $03 ; Get parameters for entire path of HBAs
SCSIReleaseQ EQU $04 ; Release the frozen SIM queue for particular LUN
SCSIAbortCommand EQU $10 ; Abort the selected Control Block
SCSIResetBus EQU $11 ; Reset the SCSI bus
SCSIResetDevice EQU $12 ; Reset the SCSI device
SCSITerminateIO EQU $13 ; Terminate any pending IO
SCSIGetVirtualIDInfo EQU $80 ; Find out which bus old ID is on
SCSILoadDriver EQU $82 ; Load a driver for a device ident
SCSIOldCall EQU $84 ; XPT->SIM private call for old-API
SCSICreateRefNumXref EQU $85 ; Register a DeviceIdent to drvr RefNum xref
SCSILookupRefNumXref EQU $86 ; Get DeviceIdent to drvr RefNum xref
SCSIRemoveRefNumXref EQU $87 ; Remove a DeviceIdent to drvr RefNum xref
SCSIRegisterWithNewXPT EQU $88 ; XPT has changed - SIM needs to re-register itself
vendorUnique EQU $C0 ; 0xC0 thru 0xFF
; Define DeviceIdent structure
DeviceIdent RECORD 0
diReserved ds.b 1 ; offset: $0 (0) ; reserved
bus ds.b 1 ; offset: $1 (1) ; SCSI - Bus Number
targetID ds.b 1 ; offset: $2 (2) ; SCSI - Target SCSI ID
LUN ds.b 1 ; offset: $3 (3) ; SCSI - LUN
sizeof EQU * ; size: $4 (4)
ENDR
;
; #endif // FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE
; #if FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE
;
; Allocation length defines for some of the fields
handshakeDataLength EQU 8 ; Handshake data length
maxCDBLength EQU 16 ; Space for the CDB bytes/pointer
vendorIDLength EQU 16 ; ASCII string len for Vendor ID
; typedef unsigned char * SCSIDataPtr
; Command Descriptor Block structure
CDB RECORD 0
cdbPtr ds.l 1 ; offset: $0 (0) ; pointer to the CDB, or
ORG 0
cdbBytes ds.b 16 ; offset: $0 (0) ; the actual CDB to send
sizeof EQU * ; size: $10 (16)
ENDR
; typedef union CDB * CDBPtr
; Scatter/gather list element
SGRecord RECORD 0
SGAddr ds.l 1 ; offset: $0 (0)
SGCount ds.l 1 ; offset: $4 (4)
sizeof EQU * ; size: $8 (8)
ENDR
;
; #endif // FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE
; #if FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE
;
SCSIHdr RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
sizeof EQU * ; size: $24 (36)
ENDR
SCSI_PB RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
sizeof EQU * ; size: $24 (36)
ENDR
;
; #endif // FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE
; This is temporary until we have connection protocol ready.
; #if FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE
;
SCSI_IO RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
scsiResultFlags ds.w 1 ; offset: $24 (36) ; <- Flags which modify the scsiResult field
scsiReserved3pt5 ds.w 1 ; offset: $26 (38) ; -> Reserved
scsiDataPtr ds.l 1 ; offset: $28 (40) ; -> Pointer to the data buffer or the S/G list
scsiDataLength ds.l 1 ; offset: $2C (44) ; -> Data transfer length
scsiSensePtr ds.l 1 ; offset: $30 (48) ; -> Ptr to autosense data buffer
scsiSenseLength ds.b 1 ; offset: $34 (52) ; -> size of the autosense buffer
scsiCDBLength ds.b 1 ; offset: $35 (53) ; -> Number of bytes for the CDB
scsiSGListCount ds.w 1 ; offset: $36 (54) ; -> num of scatter gather list entries
scsiReserved4 ds.l 1 ; offset: $38 (56) ; <- reserved for output
scsiSCSIstatus ds.b 1 ; offset: $3C (60) ; <- Returned scsi device status
scsiSenseResidual ds.b 1 ; offset: $3D (61) ; <- Autosense residual length
scsiReserved5 ds.w 1 ; offset: $3E (62) ; <- reserved for output
scsiDataResidual ds.l 1 ; offset: $40 (64) ; <- Returned Transfer residual length
scsiCDB ds CDB ; offset: $44 (68) ; -> Actual CDB or pointer to CDB
scsiTimeout ds.l 1 ; offset: $54 (84) ; -> Timeout value (Time Mgr format) (CAM timeout)
scsiReserved5pt5 ds.l 1 ; offset: $58 (88) ; -> Reserved
scsiReserved5pt6 ds.w 1 ; offset: $5C (92) ; -> Reserved
scsiIOFlags ds.w 1 ; offset: $5E (94) ; -> additional I/O flags
scsiTagAction ds.b 1 ; offset: $60 (96) ; -> What to do for tag queuing
scsiReserved6 ds.b 1 ; offset: $61 (97) ; -> reserved for input
scsiReserved7 ds.w 1 ; offset: $62 (98) ; -> reserved for input
scsiSelectTimeout ds.w 1 ; offset: $64 (100) ; -> Select timeout value
scsiDataType ds.b 1 ; offset: $66 (102) ; -> Data description type (i.e. buffer, TIB, S/G)
scsiTransferType ds.b 1 ; offset: $67 (103) ; -> Transfer type (i.e. Blind vs Polled)
scsiReserved8 ds.l 1 ; offset: $68 (104) ; -> reserved for input
scsiReserved9 ds.l 1 ; offset: $6C (108) ; -> reserved for input
scsiHandshake ds.w 8 ; offset: $70 (112) ; -> handshaking points (null term'd)
scsiReserved10 ds.l 1 ; offset: $80 (128) ; -> reserved for input
scsiReserved11 ds.l 1 ; offset: $84 (132) ; -> reserved for input
scsiCommandLink ds.l 1 ; offset: $88 (136) ; -> Ptr to the next PB in linked cmd chain
scsiSIMpublics ds.b 8 ; offset: $8C (140) ; -> reserved for input to 3rd-party SIMs
scsiAppleReserved6 ds.b 8 ; offset: $94 (148) ; -> reserved for input
; XPT layer privates (for old-API emulation)
scsiCurrentPhase ds.w 1 ; offset: $9C (156) ; <- phase upon completing old call
scsiSelector ds.w 1 ; offset: $9E (158) ; -> selector specified in old calls
scsiOldCallResult ds.w 1 ; offset: $A0 (160) ; <- result of old call
scsiSCSImessage ds.b 1 ; offset: $A2 (162) ; <- Returned scsi device message (for SCSIComplete)
XPTprivateFlags ds.b 1 ; offset: $A3 (163) ; <> various flags
XPTextras ds.b 12 ; offset: $A4 (164) ;
sizeof EQU * ; size: $B0 (176)
ENDR
SCSIExecIOPB RECORD 0
f ds SCSI_IO
sizeof EQU * ; size: $B0 (176)
ENDR
; Bus inquiry PB
SCSIBusInquiryPB RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
scsiEngineCount ds.w 1 ; offset: $24 (36) ; <- Number of engines on HBA
scsiMaxTransferType ds.w 1 ; offset: $26 (38) ; <- Number of transfer types for this HBA
scsiDataTypes ds.l 1 ; offset: $28 (40) ; <- which data types are supported by this SIM
scsiIOpbSize ds.w 1 ; offset: $2C (44) ; <- Size of SCSI_IO PB for this SIM/HBA
scsiMaxIOpbSize ds.w 1 ; offset: $2E (46) ; <- Size of max SCSI_IO PB for all SIM/HBAs
scsiFeatureFlags ds.l 1 ; offset: $30 (48) ; <- Supported features flags field
scsiVersionNumber ds.b 1 ; offset: $34 (52) ; <- Version number for the SIM/HBA
scsiHBAInquiry ds.b 1 ; offset: $35 (53) ; <- Mimic of INQ byte 7 for the HBA
scsiTargetModeFlags ds.b 1 ; offset: $36 (54) ; <- Flags for target mode support
scsiScanFlags ds.b 1 ; offset: $37 (55) ; <- Scan related feature flags
scsiSIMPrivatesPtr ds.l 1 ; offset: $38 (56) ; <- Ptr to SIM private data area
scsiSIMPrivatesSize ds.l 1 ; offset: $3C (60) ; <- Size of SIM private data area
scsiAsyncFlags ds.l 1 ; offset: $40 (64) ; <- Event cap. for Async Callback
scsiHiBusID ds.b 1 ; offset: $44 (68) ; <- Highest path ID in the subsystem
scsiInitiatorID ds.b 1 ; offset: $45 (69) ; <- ID of the HBA on the SCSI bus
scsiBIReserved0 ds.w 1 ; offset: $46 (70) ;
scsiBIReserved1 ds.l 1 ; offset: $48 (72) ; <-
scsiFlagsSupported ds.l 1 ; offset: $4C (76) ; <- which scsiFlags are supported
scsiIOFlagsSupported ds.w 1 ; offset: $50 (80) ; <- which scsiIOFlags are supported
scsiWeirdStuff ds.w 1 ; offset: $52 (82) ; <-
scsiMaxTarget ds.w 1 ; offset: $54 (84) ; <- maximum Target number supported
scsiMaxLUN ds.w 1 ; offset: $56 (86) ; <- maximum Logical Unit number supported
scsiSIMVendor ds.b 16 ; offset: $58 (88) ; <- Vendor ID of SIM (or XPT if bus<FF)
scsiHBAVendor ds.b 16 ; offset: $68 (104) ; <- Vendor ID of the HBA
scsiControllerFamily ds.b 16 ; offset: $78 (120) ; <- Family of SCSI Controller
scsiControllerType ds.b 16 ; offset: $88 (136) ; <- Specific Model of SCSI Controller used
scsiXPTversion ds.b 4 ; offset: $98 (152) ; <- version number of XPT
scsiSIMversion ds.b 4 ; offset: $9C (156) ; <- version number of SIM
scsiHBAversion ds.b 4 ; offset: $A0 (160) ; <- version number of HBA
scsiHBAslotType ds.b 1 ; offset: $A4 (164) ; <- type of "slot" that this HBA is in
scsiHBAslotNumber ds.b 1 ; offset: $A5 (165) ; <- slot number of this HBA
scsiSIMsRsrcID ds.w 1 ; offset: $A6 (166) ; <- resource ID of this SIM
scsiBIReserved3 ds.w 1 ; offset: $A8 (168) ; <-
scsiAdditionalLength ds.w 1 ; offset: $AA (170) ; <- additional BusInquiry PB len
sizeof EQU * ; size: $AC (172)
ENDR
; Abort SIM Request PB
SCSIAbortCommandPB RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
scsiIOptr ds.l 1 ; offset: $24 (36) ; Pointer to the PB to abort
sizeof EQU * ; size: $28 (40)
ENDR
; Terminate I/O Process Request PB
SCSITerminateIOPB RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
scsiIOptr ds.l 1 ; offset: $24 (36) ; Pointer to the PB to terminate
sizeof EQU * ; size: $28 (40)
ENDR
; Reset SCSI Bus PB
SCSIResetBusPB RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
sizeof EQU * ; size: $24 (36)
ENDR
; Reset SCSI Device PB
SCSIResetDevicePB RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
sizeof EQU * ; size: $24 (36)
ENDR
; Release SIM Queue PB
SCSIReleaseQPB RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
sizeof EQU * ; size: $24 (36)
ENDR
ENDIF
IF FOR_SYSTEM7_ONLY THEN
; SCSI Get Virtual ID Info PB
SCSIGetVirtualIDInfoPB RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
scsiOldCallID ds.w 1 ; offset: $24 (36) ; -> SCSI ID of device in question
scsiExists ds.b 1 ; offset: $26 (38) ; <- true if device exists
filler ds.b 1 ; offset: $27 (39)
sizeof EQU * ; size: $28 (40)
ENDR
; Create/Lookup/Remove RefNum for Device PB
SCSIDriverPB RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
scsiDriver ds.w 1 ; offset: $24 (36) ; -> DriverRefNum, For SetDriver, <- For GetNextDriver
scsiDriverFlags ds.w 1 ; offset: $26 (38) ; <> Details of driver/device
scsiNextDevice ds DeviceIdent ; offset: $28 (40) ; <- DeviceIdent of the NEXT Item in the list
sizeof EQU * ; size: $2C (44)
ENDR
; Load Driver PB
SCSILoadDriverPB RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4) ; -> reserved for input
scsiPBLength ds.w 1 ; offset: $6 (6) ; -> Length of the entire PB
scsiFunctionCode ds.b 1 ; offset: $8 (8) ; -> function selector
scsiReserved2 ds.b 1 ; offset: $9 (9) ; <- reserved for output
scsiResult ds.w 1 ; offset: $A (10) ; <- Returned result
scsiDevice ds DeviceIdent ; offset: $C (12) ; -> Device Identifier (bus+target+lun)
scsiCompletion ds.l 1 ; offset: $10 (16) ; -> Callback on completion function
scsiFlags ds.l 1 ; offset: $14 (20) ; -> assorted flags
scsiDriverStorage ds.l 1 ; offset: $18 (24) ; <> Ptr for driver private use
scsiXPTprivate ds.l 1 ; offset: $1C (28) ; private field for use in XPT
scsiReserved3 ds.l 1 ; offset: $20 (32) ; reserved
scsiLoadedRefNum ds.w 1 ; offset: $24 (36) ; <- SIM returns refnum of driver
scsiDiskLoadFailed ds.b 1 ; offset: $26 (38) ; -> if true, indicates call after failure to load
filler ds.b 1 ; offset: $27 (39)
sizeof EQU * ; size: $28 (40)
ENDR
ENDIF
IF FOR_SYSTEM7_AND_SYSTEM8_PREEMPTIVE THEN
; Defines for the scsiTransferType field
scsiTransferBlind EQU 0
scsiTransferPolled EQU 1
scsiErrorBase EQU -7936
scsiRequestInProgress EQU 1 ; 1 = PB request is in progress
; Execution failed 00-2F
scsiRequestAborted EQU -7934 ; -7934 = PB request aborted by the host
scsiUnableToAbort EQU -7933 ; -7933 = Unable to Abort PB request
scsiNonZeroStatus EQU -7932 ; -7932 = PB request completed with an err
scsiUnused05 EQU -7931 ; -7931 =
scsiUnused06 EQU -7930 ; -7930 =
scsiUnused07 EQU -7929 ; -7929 =
scsiUnused08 EQU -7928 ; -7928 =
scsiUnableToTerminate EQU -7927 ; -7927 = Unable to Terminate I/O PB req
scsiSelectTimeout EQU -7926 ; -7926 = Target selection timeout
scsiCommandTimeout EQU -7925 ; -7925 = Command timeout
scsiIdentifyMessageRejected EQU -7924 ; -7924 =
scsiMessageRejectReceived EQU -7923 ; -7923 = Message reject received
scsiSCSIBusReset EQU -7922 ; -7922 = SCSI bus reset sent/received
scsiParityError EQU -7921 ; -7921 = Uncorrectable parity error occured
scsiAutosenseFailed EQU -7920 ; -7920 = Autosense: Request sense cmd fail
scsiUnused11 EQU -7919 ; -7919 =
scsiDataRunError EQU -7918 ; -7918 = Data overrun/underrun error
scsiUnexpectedBusFree EQU -7917 ; -7917 = Unexpected BUS free
scsiSequenceFailed EQU -7916 ; -7916 = Target bus phase sequence failure
scsiWrongDirection EQU -7915 ; -7915 = Data phase was in wrong direction
scsiUnused16 EQU -7914 ; -7914 =
scsiBDRsent EQU -7913 ; -7913 = A SCSI BDR msg was sent to target
scsiTerminated EQU -7912 ; -7912 = PB request terminated by the host
scsiNoNexus EQU -7911 ; -7911 = Nexus is not established
scsiCDBReceived EQU -7910 ; -7910 = The SCSI CDB has been received
; Couldn't begin execution 30-3F
scsiTooManyBuses EQU -7888 ; -7888 = Register failed because we're full
scsiBusy EQU -7887 ; -7887 = SCSI subsystem is busy
scsiProvideFail EQU -7886 ; -7886 = Unable to provide requ. capability
scsiDeviceNotThere EQU -7885 ; -7885 = SCSI device not installed/there
scsiNoHBA EQU -7884 ; -7884 = No HBA detected Error
scsiDeviceConflict EQU -7883 ; -7883 = sorry, max 1 refNum per DeviceIdent
scsiNoSuchXref EQU -7882 ; -7882 = no such RefNum xref
scsiQLinkInvalid EQU -7881 ; -7881 = pre-linked PBs not supported
; (The QLink field was nonzero)
; Parameter errors 40-7F
scsiPBLengthError EQU -7872 ; -7872 = (scsiPBLength is insuf'ct/invalid
scsiFunctionNotAvailable EQU -7871 ; -7871 = The requ. func is not available
scsiRequestInvalid EQU -7870 ; -7870 = PB request is invalid
scsiBusInvalid EQU -7869 ; -7869 = Bus ID supplied is invalid
scsiTIDInvalid EQU -7868 ; -7868 = Target ID supplied is invalid
scsiLUNInvalid EQU -7867 ; -7867 = LUN supplied is invalid
scsiIDInvalid EQU -7866 ; -7866 = The initiator ID is invalid
scsiDataTypeInvalid EQU -7865 ; -7865 = scsiDataType requested not supported
scsiTransferTypeInvalid EQU -7864 ; -7864 = scsiTransferType field is too high
scsiCDBLengthInvalid EQU -7863 ; -7863 = scsiCDBLength field is too big
; New errors for SCSI Family
kSCSITargetProbeInvalidState EQU -7862 ; -7862 = bus prober internal software error
scsiBadObjectID EQU -7861 ; -7861 = bad object ID to send message
scsiBadDataLength EQU -7860 ; -7860 = a zero data length in PB
scsiPartialPrepared EQU -7859 ; -7859 = could not do full prepare mem for I/O
scsiBadPBSize EQU -7872 ; -7872 = Incorrect parameter block size
scsiInvalidMsgType EQU -7858 ; -7858 = Invalid message type
scsiInvalidRegID EQU -7857 ; -7857 = Invalid registry Entry ID
scsiBadConnID EQU -7856 ; -7856 = Bad Connection ID
scsiBadIOTag EQU -7855 ; -7855 = Bad IO Tag
scsiIOInProgress EQU -7854 ; -7854 = Can't close conn, IO in prog
scsiTargetReserved EQU -7853 ; -7853 = Target already reserved
scsiTargetInUsed EQU -7852 ; -7852 = Target is in used can't resv
scsiNoReserveOnBus EQU -7851 ; -7851 = Can't reserved on bus
scsiBadConnType EQU -7850 ; -7850 = Bad connection type
scsiExecutionErrors EQU -7936
scsiNotExecutedErrors EQU -7888
scsiParameterErrors EQU -7872
; Defines for the scsiResultFlags field
scsiSIMQFrozen EQU $0001 ; The SIM queue is frozen w/this err
scsiAutosenseValid EQU $0002 ; Autosense data valid for target
scsiBusNotFree EQU $0004 ; At time of callback, SCSI bus is not free
; Defines for the bit numbers of the scsiFlags field in the PB header for the SCSIExecIO function
kbSCSIDisableAutosense EQU 29 ; Disable auto sense feature
kbSCSIFlagReservedA EQU 28 ;
kbSCSIFlagReserved0 EQU 27 ;
kbSCSICDBLinked EQU 26 ; The PB contains a linked CDB
kbSCSIQEnable EQU 25 ; Target queue actions are enabled
kbSCSICDBIsPointer EQU 24 ; The CDB field contains a pointer
kbSCSIFlagReserved1 EQU 23 ;
kbSCSIInitiateSyncData EQU 22 ; Attempt Sync data xfer and SDTR
kbSCSIDisableSyncData EQU 21 ; Disable sync, go to async
kbSCSISIMQHead EQU 20 ; Place PB at the head of SIM Q
kbSCSISIMQFreeze EQU 19 ; Return the SIM Q to frozen state
kbSCSISIMQNoFreeze EQU 18 ; Disallow SIM Q freezing
kbSCSIDoDisconnect EQU 17 ; Definitely do disconnect
kbSCSIDontDisconnect EQU 16 ; Definitely don't disconnect
kbSCSIDataReadyForDMA EQU 15 ; Data buffer(s) are ready for DMA
kbSCSIFlagReserved3 EQU 14 ;
kbSCSIDataPhysical EQU 13 ; SG/Buffer data ptrs are physical
kbSCSISensePhysical EQU 12 ; Autosense buffer ptr is physical
kbSCSIFlagReserved5 EQU 11 ;
kbSCSIFlagReserved6 EQU 10 ;
kbSCSIFlagReserved7 EQU 9 ;
kbSCSIFlagReserved8 EQU 8 ;
kbSCSIDataBufferValid EQU 7 ; Data buffer valid
kbSCSIStatusBufferValid EQU 6 ; Status buffer valid
kbSCSIMessageBufferValid EQU 5 ; Message buffer valid
kbSCSIFlagReserved9 EQU 4 ;
; Defines for the bit masks of the scsiFlags field
scsiDirectionMask EQU $C0000000 ; Data direction mask
scsiDirectionNone EQU $C0000000 ; Data direction (11: no data)
scsiDirectionReserved EQU $00000000 ; Data direction (00: reserved)
scsiDirectionOut EQU $80000000 ; Data direction (10: DATA OUT)
scsiDirectionIn EQU $40000000 ; Data direction (01: DATA IN)
scsiDisableAutosense EQU $20000000 ; Disable auto sense feature
scsiFlagReservedA EQU $10000000 ;
scsiFlagReserved0 EQU $08000000 ;
scsiCDBLinked EQU $04000000 ; The PB contains a linked CDB
scsiQEnable EQU $02000000 ; Target queue actions are enabled
scsiCDBIsPointer EQU $01000000 ; The CDB field contains a pointer
scsiFlagReserved1 EQU $00800000 ;
scsiInitiateSyncData EQU $00400000 ; Attempt Sync data xfer and SDTR
scsiDisableSyncData EQU $00200000 ; Disable sync, go to async
scsiSIMQHead EQU $00100000 ; Place PB at the head of SIM Q
scsiSIMQFreeze EQU $00080000 ; Return the SIM Q to frozen state
scsiSIMQNoFreeze EQU $00040000 ; Disallow SIM Q freezing
scsiDoDisconnect EQU $00020000 ; Definitely do disconnect
scsiDontDisconnect EQU $00010000 ; Definitely don't disconnect
scsiDataReadyForDMA EQU $00008000 ; Data buffer(s) are ready for DMA
scsiFlagReserved3 EQU $00004000 ;
scsiDataPhysical EQU $00002000 ; SG/Buffer data ptrs are physical
scsiSensePhysical EQU $00001000 ; Autosense buffer ptr is physical
scsiFlagReserved5 EQU $00000800 ;
scsiFlagReserved6 EQU $00000400 ;
scsiFlagReserved7 EQU $00000200 ;
scsiFlagReserved8 EQU $00000100 ;
; bit masks for the scsiIOFlags field in SCSIExecIOPB
scsiNoParityCheck EQU $0002 ; disable parity checking
scsiDisableSelectWAtn EQU $0004 ; disable select w/Atn
scsiSavePtrOnDisconnect EQU $0008 ; do SaveDataPointer upon Disconnect msg
scsiNoBucketIn EQU $0010 ; don't bit bucket in during this I/O
scsiNoBucketOut EQU $0020 ; don't bit bucket out during this I/O
scsiDisableWide EQU $0040 ; disable wide transfer negotiation
scsiInitiateWide EQU $0080 ; initiate wide transfer negotiation
scsiRenegotiateSense EQU $0100 ; renegotiate sync/wide before issuing autosense
scsiDisableDiscipline EQU $0200 ; disable parameter checking on SCSIExecIO calls
scsiIOFlagReserved0080 EQU $0080 ;
scsiIOFlagReserved8000 EQU $8000 ;
; Defines for the Bus Inquiry PB fields.
; scsiHBAInquiry field bits
scsiBusMDP EQU $80 ; Supports Modify Data Pointer message
scsiBusWide32 EQU $40 ; Supports 32 bit wide SCSI
scsiBusWide16 EQU $20 ; Supports 16 bit wide SCSI
scsiBusSDTR EQU $10 ; Supports Sync Data Transfer Req message
scsiBusLinkedCDB EQU $08 ; Supports linked CDBs
scsiBusTagQ EQU $02 ; Supports tag queue message
scsiBusSoftReset EQU $01 ; Supports soft reset
; Defines for the scsiDataType field
scsiDataBuffer EQU 0 ; single contiguous buffer supplied
scsiDataTIB EQU 1 ; TIB supplied (ptr in scsiDataPtr)
scsiDataSG EQU 2 ; scatter/gather list supplied
scsiDataIOTable EQU 3 ;#(7/11/95) Prepared by Block Storage
scsiDataMemList EQU 4 ; (2/6/96) Memory list
; scsiDataTypes field bits
; bits 0->15 Apple-defined, 16->30 3rd-party unique, 31 = reserved
scsiBusDataTIB EQU $02 ; TIB supplied (ptr in scsiDataPtr)
scsiBusDataBuffer EQU $01 ; single contiguous buffer supplied
scsiBusDataSG EQU $04 ; scatter/gather list supplied
scsiBusDataIOTable EQU $08 ; (2/6/95) Prepare Memory for IO
scsiBusDataMemList EQU $10 ; (2/6/96) Memory list
scsiBusDataReserved EQU $80000000 ;
; scsiScanFlags field bits
scsiBusScansDevices EQU $80 ; Bus scans for and maintains device list
scsiBusScansOnInit EQU $40 ; Bus scans performed at power-up/reboot
scsiBusLoadsROMDrivers EQU $20 ; may load ROM drivers to support targets
; scsiFeatureFlags field bits
scsiBusInternalExternalMask EQU $000000C0 ; bus internal/external mask
scsiBusInternalExternalUnknown EQU $00000000 ; not known whether bus is inside or outside
scsiBusInternalExternal EQU $000000C0 ; bus goes inside and outside the box
scsiBusInternal EQU $00000080 ; bus goes inside the box
scsiBusExternal EQU $00000040 ; bus goes outside the box
scsiBusCacheCoherentDMA EQU $00000020 ; DMA is cache coherent
scsiBusOldCallCapable EQU $00000010 ; SIM is old call capable
scsiBusDifferential EQU $00000004 ; Single Ended (0) or Differential (1)
scsiBusFastSCSI EQU $00000002 ; HBA supports fast SCSI
scsiBusDMAavailable EQU $00000001 ; DMA is available
; scsiWeirdStuff field bits
scsiOddDisconnectUnsafeRead1 EQU $0001 ; Disconnects on odd byte boundries are unsafe with DMA and/or blind reads
scsiOddDisconnectUnsafeWrite1 EQU $0002 ; Disconnects on odd byte boundries are unsafe with DMA and/or blind writes
scsiBusErrorsUnsafe EQU $0004 ; Non-handshaked delays or disconnects during blind transfers may cause a crash
scsiRequiresHandshake EQU $0008 ; Non-handshaked delays or disconnects during blind transfers may cause data corruption
scsiTargetDrivenSDTRSafe EQU $0010 ; Targets which initiate synchronous negotiations are supported
scsiOddCountForPhysicalUnsafe EQU $0020 ; If using physical addrs all counts must be even, and disconnects must be on even boundries
scsiAbortCmdFixed EQU $0040 ; Set if abort command is fixed to properly make callbacks
; scsiHBAslotType values
scsiMotherboardBus EQU $01 ; A built in Apple supplied bus
scsiNuBus EQU $02 ; A SIM on a NuBus card
scsiPDSBus EQU $03 ; " on a PDS card
scsiPCIBus EQU $04 ; " on a PCI bus card
scsiPCMCIABus EQU $05 ; " on a PCMCIA card
scsiFireWireBridgeBus EQU $06 ; " connected through a FireWire bridge
ENDIF
IF FOR_SYSTEM7_ONLY THEN
; Defines for the scsiDriverFlags field (in SCSIDriverPB)
scsiDeviceSensitive EQU $0001 ; Only driver should access this device
scsiDeviceNoOldCallAccess EQU $0002 ; no old call access to this device
; SCSI status
scsiStatGood EQU $00 ; Good Status
scsiStatCheckCondition EQU $02 ; Check Condition
scsiStatConditionMet EQU $04 ; Condition Met
scsiStatBusy EQU $08 ; Busy
scsiStatIntermediate EQU $10 ; Intermediate
scsiStatIntermedMet EQU $14 ; Intermediate - Condition Met
scsiStatResvConflict EQU $18 ; Reservation conflict
scsiStatTerminated EQU $20 ; Command terminated
scsiStatQFull EQU $28 ; Queue full
; SCSI messages
kCmdCompleteMsg EQU 0
kExtendedMsg EQU 1 ; 0x01
kSaveDataPointerMsg EQU 2 ; 0x02
kRestorePointersMsg EQU 3 ; 0x03
kDisconnectMsg EQU 4 ; 0x04
kInitiatorDetectedErrorMsg EQU 5 ; 0x05
kAbortMsg EQU 6 ; 0x06
kMsgRejectMsg EQU 7 ; 0x07
kNoOperationMsg EQU 8 ; 0x08
kMsgParityErrorMsg EQU 9 ; 0x09
kLinkedCmdCompleteMsg EQU 10 ; 0x0a
kLinkedCmdCompleteWithFlagMsg EQU 11 ; 0x0b
kBusDeviceResetMsg EQU 12 ; 0x0c
kAbortTagMsg EQU 13 ; 0x0d
kClearQueueMsg EQU 14 ; 0x0e
kInitiateRecoveryMsg EQU 15 ; 0x0f
kReleaseRecoveryMsg EQU 16 ; 0x10
kTerminateIOProcessMsg EQU 17 ; 0x11
kSimpleQueueTag EQU $20 ; 0x20
kHeadOfQueueTagMsg EQU $21 ; 0x21
kOrderedQueueTagMsg EQU $22 ; 0x22
kIgnoreWideResidueMsg EQU $23 ; 0x23
ENDIF
IF FOR_SYSTEM7_AND_SYSTEM8_COOPERATIVE THEN
; SIMInitInfo PB
; directions are for SCSIRegisterBus call ( -> parm, <- result)
SIMInitInfo RECORD 0
SIMstaticPtr ds.l 1 ; offset: $0 (0) ; <- alloc. ptr to the SIM's static vars
staticSize ds.l 1 ; offset: $4 (4) ; -> num bytes SIM needs for static vars
SIMInit ds.l 1 ; offset: $8 (8) ; -> pointer to the SIM init routine
SIMAction ds.l 1 ; offset: $C (12) ; -> pointer to the SIM action routine
SIM_ISR ds.l 1 ; offset: $10 (16) ; reserved
SIMInterruptPoll ds.l 1 ; offset: $14 (20) ; -> pointer to the SIM interrupt poll routine
NewOldCall ds.l 1 ; offset: $18 (24) ; -> pointer to the SIM NewOldCall routine
ioPBSize ds.w 1 ; offset: $1C (28) ; -> size of SCSI_IO_PBs required for this SIM
oldCallCapable ds.b 1 ; offset: $1E (30) ; -> true if this SIM can handle old-API calls
simInfoUnused1 ds.b 1 ; offset: $1F (31) ; reserved
simInternalUse ds.l 1 ; offset: $20 (32) ; xx not affected or viewed by XPT
XPT_ISR ds.l 1 ; offset: $24 (36) ; reserved
EnteringSIM ds.l 1 ; offset: $28 (40) ; <- ptr to the EnteringSIM routine
ExitingSIM ds.l 1 ; offset: $2C (44) ; <- ptr to the ExitingSIM routine
MakeCallback ds.l 1 ; offset: $30 (48) ; <- the XPT layer's SCSIMakeCallback routine
busID ds.w 1 ; offset: $34 (52) ; <- bus number for the registered bus
simSlotNumber ds.b 1 ; offset: $36 (54) ; <- Magic cookie to place in scsiHBASlotNumber (PCI)
simSRsrcID ds.b 1 ; offset: $37 (55) ; <- Magic cookie to place in scsiSIMsRsrcID (PCI)
simRegEntry ds.l 1 ; offset: $38 (56) ; -> The SIM's RegEntryIDPtr (PCI)
sizeof EQU * ; size: $3C (60)
ENDR
; Glue between SCSI calls and SCSITrap format
xptSCSIAction EQU $0001
xptSCSIRegisterBus EQU $0002
xptSCSIDeregisterBus EQU $0003
xptSCSIReregisterBus EQU $0004
xptSCSIKillXPT EQU $0005 ; kills Mini-XPT after transition
xptSCSIInitialize EQU $000A ; Initialize the SCSI manager
; moveq #kSCSIx, D0; _SCSIAtomic
;
; pascal OSErr SCSIAction(SCSI_PB *parameterBlock)
;
IF ¨ GENERATINGCFM THEN
; parameters:
; parameterBlock => A0
; returns:
; OSErr <= D0
Macro
_SCSIAction
moveq #1,D0
dc.w $A089
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIAction
ENDIF
;
; pascal OSErr SCSIRegisterBus(SIMInitInfo *parameterBlock)
;
IF ¨ GENERATINGCFM THEN
; parameters:
; parameterBlock => A0
; returns:
; OSErr <= D0
Macro
_SCSIRegisterBus
moveq #2,D0
dc.w $A089
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIRegisterBus
ENDIF
;
; pascal OSErr SCSIDeregisterBus(SCSI_PB *parameterBlock)
;
IF ¨ GENERATINGCFM THEN
; parameters:
; parameterBlock => A0
; returns:
; OSErr <= D0
Macro
_SCSIDeregisterBus
moveq #3,D0
dc.w $A089
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIDeregisterBus
ENDIF
;
; pascal OSErr SCSIReregisterBus(SIMInitInfo *parameterBlock)
;
IF ¨ GENERATINGCFM THEN
; parameters:
; parameterBlock => A0
; returns:
; OSErr <= D0
Macro
_SCSIReregisterBus
moveq #4,D0
dc.w $A089
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIReregisterBus
ENDIF
;
; pascal OSErr SCSIKillXPT(SIMInitInfo *parameterBlock)
;
IF ¨ GENERATINGCFM THEN
; parameters:
; parameterBlock => A0
; returns:
; OSErr <= D0
Macro
_SCSIKillXPT
moveq #5,D0
dc.w $A089
EndM
ELSE
IMPORT_CFM_FUNCTION SCSIKillXPT
ENDIF
;
; extern OSStatus SCSIInitBFPI(void )
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIInitBFPI
ENDIF
ENDIF
IF FOR_SYSTEM8_PREEMPTIVE THEN
;
; File: SCSIConn.h
;
; Contains: Connection Based parameter checking
;
; Version: 0.1
;
; Written by: Darryl Chan
;
; Copyright: © 1995-1996 by Apple Computer, Inc., all rights reserved.
;
; File Ownership:
;
; DRI: Darryl Chan
;
; Other Contact: Stanford Au
;
; Technology: IO Group
;
; Writers:
;
; (DC) Darryl Chan
;
; Change History (most recent first):
;
; <4> 1/25/96 DC Integrate to D11 - name registry changes
; <3> 1/18/96 DC Split file to public and private interfaces and converting to
; MrC.
; <2> 1/15/96 DC Add more commands
; <1> 1/3/96 DC First checked in.
;
;
; typedef UInt32 ConnectionType
; typedef ObjectID ConnectionID
; typedef MessageID SCSIExecIOTag
kMaxAutoSenseByteCount EQU 255 ; max sense byte buffer size
; values for 'type's of connection (UInt16)
kReservedAccess EQU $0100 ; Reserved Access
kSharedAccess EQU $0200 ; Shared Access
SCSIDataObject RECORD 0
scsiDataPtr ds.l 1 ; offset: $0 (0)
scsiDataLength ds.l 1 ; offset: $4 (4)
scsiDataType ds.w 1 ; offset: $8 (8)
scsiSGListCount ds.w 1 ; offset: $A (10)
sizeof EQU * ; size: $C (12)
ENDR
SCSICDBObject RECORD 0
scsiCDBLength ds.w 1 ; offset: $0 (0)
scsiCDB ds CDB ; offset: $2 (2)
sizeof EQU * ; size: $12 (18)
ENDR
SCSIFlagsObject RECORD 0
scsiFlags ds.l 1 ; offset: $0 (0)
scsiIOFlags ds.w 1 ; offset: $4 (4)
scsiTransferType ds.w 1 ; offset: $6 (6)
sizeof EQU * ; size: $8 (8)
ENDR
SCSIExecIOResult RECORD 0
scsiResult ds.l 1 ; offset: $0 (0)
scsiResultFlags ds.w 1 ; offset: $4 (4)
scsiSenseLength ds.w 1 ; offset: $6 (6) ; the actual sense length returned
scsiDataResidual ds.l 1 ; offset: $8 (8) ; residual data length
ioTag ds.l 1 ; offset: $C (12)
scsiSense ds.b 255 ; offset: $10 (16) ; maximum sense buffer
scsiSCSIstatus ds.b 1 ; offset: $10F (271)
sizeof EQU * ; size: $110 (272)
ENDR
SCSIIOOptionsObject RECORD 0
scsiFlags ds.l 1 ; offset: $0 (0)
scsiIOFlags ds.l 1 ; offset: $4 (4)
sizeof EQU * ; size: $8 (8)
ENDR
SCSIHandshakeObject RECORD 0
scsiHandshake ds.w 8 ; offset: $0 (0)
sizeof EQU * ; size: $10 (16)
ENDR
SCSIBusInfo RECORD 0
scsiEngineCount ds.w 1 ; offset: $0 (0) ; <- Number of engines on HBA
scsiMaxTransferType ds.w 1 ; offset: $2 (2) ; <- Number of transfer types for this HBA
scsiDataTypes ds.l 1 ; offset: $4 (4) ; <- which data types are supported by this SIM
scsiBIReserved4 ds.l 1 ; offset: $8 (8) ; <-
scsiFeatureFlags ds.l 1 ; offset: $C (12) ; <- Supported features flags field
scsiVersionNumber ds.b 1 ; offset: $10 (16) ; <- Version number for the SIM/HBA
scsiHBAInquiry ds.b 1 ; offset: $11 (17) ; <- Mimic of INQ byte 7 for the HBA
scsiTargetModeFlags ds.b 1 ; offset: $12 (18) ; <- Flags for target mode support
scsiScanFlags ds.b 1 ; offset: $13 (19) ; <- Scan related feature flags
scsiSIMPrivatesPtr ds.l 1 ; offset: $14 (20) ; <- Ptr to SIM private data area
scsiSIMPrivatesSize ds.l 1 ; offset: $18 (24) ; <- Size of SIM private data area
scsiAsyncFlags ds.l 1 ; offset: $1C (28) ; <- Event cap. for Async Callback
scsiHiBusID ds.b 1 ; offset: $20 (32) ; <- Highest path ID in the subsystem
scsiInitiatorID ds.b 1 ; offset: $21 (33) ; <- ID of the HBA on the SCSI bus
scsiBIReserved0 ds.w 1 ; offset: $22 (34) ;
scsiBIReserved1 ds.l 1 ; offset: $24 (36) ; <-
scsiFlagsSupported ds.l 1 ; offset: $28 (40) ; <- which scsiFlags are supported
scsiIOFlagsSupported ds.w 1 ; offset: $2C (44) ; <- which scsiIOFlags are supported
scsiWeirdStuff ds.w 1 ; offset: $2E (46) ; <-
scsiMaxTarget ds.w 1 ; offset: $30 (48) ; <- maximum Target number supported
scsiMaxLUN ds.w 1 ; offset: $32 (50) ; <- maximum Logical Unit number supported
scsiSIMVendor ds.b 16 ; offset: $34 (52) ; <- Vendor ID of SIM (or XPT if bus<FF)
scsiHBAVendor ds.b 16 ; offset: $44 (68) ; <- Vendor ID of the HBA
scsiControllerFamily ds.b 16 ; offset: $54 (84) ; <- Family of SCSI Controller
scsiControllerType ds.b 16 ; offset: $64 (100) ; <- Specific Model of SCSI Controller used
scsiXPTversion ds.b 4 ; offset: $74 (116) ; <- version number of XPT
scsiSIMversion ds.b 4 ; offset: $78 (120) ; <- version number of SIM
scsiHBAversion ds.b 4 ; offset: $7C (124) ; <- version number of HBA
scsiHBAslotType ds.b 1 ; offset: $80 (128) ; <- type of "slot" that this HBA is in
scsiHBAslotNumber ds.b 1 ; offset: $81 (129) ; <- slot number of this HBA
scsiSIMsRsrcID ds.w 1 ; offset: $82 (130) ; <- resource ID of this SIM
scsiBIReserved3 ds.w 1 ; offset: $84 (132) ; <-
; UInt16 scsiAdditionalLength; /* <- additional BusInquiry PB len */
sizeof EQU * ; size: $86 (134)
ENDR
kSCSIDeviceTypeSize EQU 9 ; number of characters for device type
kSCSIAllBus EQU $FF ; search all bus
DeviceType RECORD 0
elements ds.b 9
ORG 10
sizeof EQU * ; size: $A (10)
ENDR
; this replaces SCSIDevList
SCSIIOIteratorData RECORD 0
deviceInfo ds IOCommonInfo ; offset: $0 (0)
deviceID ds DeviceIdent ; offset: $14 (20)
deviceType ds DeviceType ; offset: $18 (24)
ORG 34
sizeof EQU * ; size: $22 (34)
ENDR
scsiVERSION EQU 80
;
;_____________________________________________________________________
; Client type used to identify the type of client we are dealing
; with.
;_____________________________________________________________________
;
; typedef UInt8 ClientType
; for Client type
kUserClient EQU $02
kPriviClient EQU $01
kBlueUserClient EQU $06
;
;
; New command to get Registry Entry ID for the SCSI Plugin
;
SCSIGetRegEntryID EQU $89 ; Return a copy of the System Registry
SCSIGetRegEntryIDPB RECORD 0
qLink ds.l 1 ; offset: $0 (0) ; (internal use, must be nil on entry)
scsiReserved1 ds.w 1 ; offset: $4 (4)
scsiPBLength ds.w 1 ; offset: $6 (6)
scsiFunctionCode ds.b 1 ; offset: $8 (8)
scsiReserved2 ds.b 1 ; offset: $9 (9)
scsiResult ds.w 1 ; offset: $A (10)
scsiDevice ds DeviceIdent ; offset: $C (12)
scsiCompletion ds.l 1 ; offset: $10 (16)
scsiFlags ds.l 1 ; offset: $14 (20)
scsiDriverStorage ds.l 1 ; offset: $18 (24)
scsiXPTprivate ds.l 1 ; offset: $1C (28)
scsiReserved3 ds.l 1 ; offset: $20 (32)
scsiRegEntryID ds RegEntryRef ; offset: $24 (36) ; A copy of the System Registry ID
sizeof EQU * ; size: $34 (52)
ENDR
; Functions declarations
;
; extern OSStatus SCSIOpenConnection(RegEntryRef *regID, ConnectionType connType, ConnectionID *connID)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIOpenConnection
ENDIF
;
; extern OSStatus SCSICloseConnection(ConnectionID connID)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSICloseConnection
ENDIF
;
; extern OSStatus SCSIExecIOSyncCmd(ConnectionID connID, SCSIDataObject dataObject, SCSICDBObject cdbObject, SCSIFlagsObject flagsObject, SCSIExecIOResult *resultBuffer, SCSIExecIOTag *ioTag)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIExecIOSyncCmd
ENDIF
;
; extern OSStatus SCSIExecIOAsyncCmd(ConnectionID connID, KernelNotification *kernelNot, SCSIDataObject dataObject, SCSICDBObject cdbObject, SCSIFlagsObject flagsObject, SCSIExecIOResult *resultBuffer, SCSIExecIOTag *ioTag)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIExecIOAsyncCmd
ENDIF
;
; extern OSStatus SCSIAbortIOCmd(ConnectionID connID, SCSIExecIOTag ioTag)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIAbortIOCmd
ENDIF
;
; extern OSStatus SCSITerminateIOCmd(ConnectionID connID, SCSIExecIOTag ioTag)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSITerminateIOCmd
ENDIF
;
; extern OSStatus SCSIReleaseQCmd(ConnectionID connID)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIReleaseQCmd
ENDIF
;
; extern OSStatus SCSIClearQueue(ConnectionID connID)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIClearQueue
ENDIF
;
; extern OSStatus SCSIBusResetSync(ConnectionID connID, OSStatus *resultBuffer)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIBusResetSync
ENDIF
;
; extern OSStatus SCSIBusResetAsync(ConnectionID connID, KernelNotification *kernelNot, OSStatus *resultBuffer)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIBusResetAsync
ENDIF
;
; extern OSStatus SCSIDeviceResetSync(ConnectionID connID, OSStatus *resultBuffer)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIDeviceResetSync
ENDIF
;
; extern OSStatus SCSIDeviceResetAsync(ConnectionID connID, KernelNotification *kernelNot, OSStatus *resultBuffer)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIDeviceResetAsync
ENDIF
;
; extern OSStatus SCSIBusGetDeviceData(UInt8 *bus, UInt32 reqCount, UInt32 *actCount, SCSIIOIteratorData *list)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIBusGetDeviceData
ENDIF
;
; extern OSStatus SCSIBusInquiryCmd(ConnectionID connID, SCSIBusInfo *resultBuffer)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIBusInquiryCmd
ENDIF
;
; extern OSStatus SCSISetHandshake(ConnectionID connID, SCSIHandshakeObject handshake)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSISetHandshake
ENDIF
;
; extern OSStatus SCSISetTimeout(ConnectionID connID, Duration scsiTimeout, UInt16 scsiSelectTimeout)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSISetTimeout
ENDIF
;
; extern OSStatus SCSISetIOOptions(ConnectionID connID, SCSIIOOptionsObject ioOptions)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSISetIOOptions
ENDIF
;
; extern OSStatus SCSIInitFPI(void )
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIInitFPI
ENDIF
;
; extern OSStatus SCSIServer(SCSI_PB *scsiPB, KernelNotification *kernelNot)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIServer
ENDIF
;
; extern OSStatus SCSIExecIOControlSyncCmd(ConnectionID connID, SCSIDataObject dataObject, DeviceIdent deviceID, SCSICDBObject cdbObject, SCSIFlagsObject flagsObject, SCSIExecIOResult *resultBuffer, SCSIExecIOTag *ioTag)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIExecIOControlSyncCmd
ENDIF
;
; extern OSStatus SCSIExecIOControlAsyncCmd(ConnectionID connID, KernelNotification *kernelNot, SCSIDataObject dataObject, DeviceIdent deviceID, SCSICDBObject cdbObject, SCSIFlagsObject flagsObject, SCSIExecIOResult *resultBuffer, SCSIExecIOTag *ioTag)
;
IF GENERATINGCFM THEN
IMPORT_CFM_FUNCTION SCSIExecIOControlAsyncCmd
ENDIF
ENDIF
ENDIF ; __SCSI__